<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // getter 控制对象中的属性取值操作
        // setter 控制对象中的属性赋值操作
        var user = {
            name:"tom",
            age:23
        }

        console.log( user.name );
        user.name = "jack";

        // Object.defineProperty(targetObj,key,options);
        //    targetObj 目标对象（定义一个已知的对象|构建一个空对象）
        //    key 目标对象中需要详细配置的属性名称（对象中的一个新属性）
        //    options 当前属性的详细配置
        var userA = {
            age:23
        };
        var _user = {
            name:"tom"
        }
        Object.defineProperty(userA,"name",{
            configurable:true,
            enumerable:true,
            // 如果通过 getter 和 setter 进行的属性的劫持开启，为完成属性的正常取值和赋值操作
            // 必须提供一个存在于相同作用域的 默认值承载变量
            // 监控 对象中的 name 属性被取值时 需要触发的回调函数
            get(){
                console.log("=====>userA.name-getter");
                // return "返回值";
                return _user.name
            },
            // 监控 对象中的 name 属性被赋值时 需要触发的回调函数
            set(nv){
                // setter 方法默认存在一个固定的参数，该参数为属性赋值时的新数据
                console.log("=====>userA.name-setter-"+nv);
                _user.name = nv;
            }
        });
        console.log(userA);
        console.log(userA.age,userA.name);
        userA.name = "重新赋值";


    </script>
</head>
<body>
    
</body>
</html>